-- tworzenie nowego wyzwalacza ... 
CREATE TRIGGER trg_primary_key
ON DATABASE       -- ... na poziomie bazy danych ...
FOR CREATE_TABLE  -- ... dla instrukcji tworzcych tabele
AS

-- deklaracja zmiennych
DECLARE
	@schemat_i_nazwa AS XML, -- zmienna przechowujca schemat i nazw bazy danych
	@nazwa_obiektu AS NVARCHAR(300), -- zmienna przechowujca nazw obiektu
	@rezultat AS NVARCHAR(600); -- zmienna przechowujca tekst zwracanego bdu

  -- przypisanie zawartoci XML zwracanej przez funkcj eventdata()
  -- funkcja eventdata() przechowuje w postaci XML informacje o operacjach DDL
  -- wykonywanych na bazie danych
	SET @schemat_i_nazwa = eventdata();
  -- wyodrebnienie nazwy obiektu (schemat + kropka + nazwa tabeli
  -- pobranie danych nastpuje za pomoc jzyka XQuery (uyto funkcji Query)
	SET @nazwa_obiektu = QUOTENAME(CAST(@schemat_i_nazwa.query('data(//SchemaName)') 
AS SYSNAME)) + 
	N'.' +
	QUOTENAME(CAST(@schemat_i_nazwa.query('data(//ObjectName)') AS SYSNAME));

  -- sprawdzenie, czy utworzono klucz gwny w tworzonej tabeli
	-- 0 - nie zosta utworzony klucz gwny, 1 - zosta utworzony
	IF (OBJECTPROPERTY(OBJECT_ID(@nazwa_obiektu), 'TableHasPrimaryKey') = 0)
	BEGIN	-- w przypadku, gdy nie zosta utworzony klucz gwny
		-- budowany jest odpowiedni komunikat
		SET @rezultat = 'Tabela ' + @nazwa_obiektu + ' nie moe zosta utworzona' +
			', bo nie posiada klucza gwnego';
		-- wywoywany jest wyjtek
		RAISERROR(@rezultat, 16, 1);
		-- operacja tworzenia tabeli jest wycofywana
		ROLLBACK;
		RETURN; -- i nastepuje powrt z wyzwalacza
	END;